ÕâµÀÌ⣬ÄܰÑÌâÒâ¿´Ã÷°×£¬¾ÍºÜ²»ÈÝÒ×ÁË¡£
1,2,0 -> 0,1,2,3 -> size == 3
^
3,4,-1,1 -> -1,1,2,3,4 -> size == 4
^
°´ÕÕÉÏÊöÅÅÁз½Ê½£¬¾ÍÄܺÜÇåÎúµÄ¿´³ö£¬First Missing Positive µÄº¬Òå¡£Õâ¸öÊýÓÐÈçϼ¸¸öÌõ¼þ£º
ËùÒÔÎÊÌâÀ´ÁË£¬ÔõôÄÜÔÚÒ»´Îµü´úÖÐÕÒ³öȱµÄÄǸö£¿ÏëÏóÎÒÃÇ´óÄÔÊÇÈçºÎÒ»ÏÂ×Ó¿´³öÀ´µÄ£¿àÅ£¬ÅÅÁС£
µ«ÅÅÁÐÍ꣬¾ÍÒѾºÄ·ÑÁË O(N)£¬ÓÖÒª»¨ O(N) ȥȷÈÏȱµÄÄǸöÊý¡£Æäʵ£¬ÎÒÃÇÕæµÄÊÇÅÅÍêÐò²ÅÖªµÀ¿ÕȱÂð£¿ÏÔÈ»²»ÊÇ¡£
ÁíÍ⣬ÕâµÀÌâÒªÇó²»ÄÜÓöîÍâµÄ¿Õ¼ä£¬¼´Ê¹ÍùÅÅÐòÉÏÏ룬ҲֻÄÜÏë×ÅÈçºÎ swap ÁË¡£
Ò»°ãµÄÅÅÐò£¬µÄÈ·ÊDZȽϸ´Ôӵġ£µ«×Ðϸ¹Û²ìÕâµÀÌ⣬Äܹ»·¢ÏÖÕâ¸ö”ÅÅÐò”È´±È½ÏÌØÊ⣬Ê×ÏÈËüÊÇ´Ó 1 ¿ªÊ¼µÄ£¬ÇÒÁ¬Ðø¡£
ÕâÈÃÎÒÃÇÏëµ½ÁËÉñÂí£¿Ã»´í£¬ÏñÐòºÅ£¬¾ÍÈçÊý¾Ý¿â±íµÄ×ÔÔöÖ÷¼üÒ»Ñù£¡ÄÇôÕÒµ½È±µÄ£¬Æñ²»ÊÇÒ»Ñ۾Ϳ´³öÀ´ÁË£¿
ÈçºÎÄÜÈÃÕâ¸öÎÞÐòµÄÊý×飬¿´ÆðÀ´ÏñÐòºÅÒ»ÑùÄØ£¿¶øÇÒÊÖ¶ÎÖ»ÓÐ swap. ÓÐÁË£¬ÐòºÅÎÒÃÇÊÇÖªµÀµÄ°¡£¬ÕâÑù swap ¾ÍÓÐÃ÷È·µÄÄ¿µÄÁË¡£
index: 1, 2, 3, 4
array: 3, 4,-1, 1
^ ^ --- swap(3,-1)
-1, 4, 3, 1
^ ^ --- swap(4, 1)
-1, 1, 3, 4
^ ^ --- swap(1,-1)
1,-1, 3, 4
^
¾¹ý¼¸²½ swap, ÎÒÃǾªÈ˵ķ¢ÏÖ×îÖÕ¶Ô²»ÆëµÄÄǸöÐòºÅ£¨2 : -1£©¾ÍÊÇÎÒÃÇÒªµÄ½á¹û£¡ÎÒÃdz¢ÊÔÓôúÂëÃèÊöÉÏÊö¹ý³Ì£º
for (int i=0; i<n; ++i)
while (A[i]>0 && A[i]<=n && A[i]!=A[A[i]-1]) // ǰÁ½¸öÌõ¼þÏÞ¶¨·¶Î§£¬×îºóÊÇÈç¹ûÐòºÅλÖõÄÖµÓ뵱ǰֵһÑù£¬½»»»ÎÞÒâÒå
swap(A[i], A[A[i]-1]);
for (int i=0; i<n; ++i)
if (A[i] != i+1) return i+1; // ×îºóµÄ¼ì²é£¬Ò»µ©·¢ÏÖÓëÐòºÅ²»·û£¬Á¢¿Ì·µ»Ø
return n+1; // Èç¹û¶¼Ïà·û£¬ÄÇô·µ»Ø n+16ÐУ¬Ìá½»£¬×î¸ßЧÂÊ AC.(4ms)
#include <iostream>
using std::swap;
class Solution {
public:
int firstMissingPositive(int A[], int n) {
for (int i=0; i<n; ++i)
while (A[i]>0 && A[i]<=n && A[i]!=A[A[i]-1])
swap(A[i], A[A[i]-1]);
for (int i=0; i<n; ++i)
if (A[i] != i+1) return i+1;
return n+1;
}
};